
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package Metier;

import AccesAuxDonnees.*;
import Affichage.Affichage;
import Affichage.Ajouter;
import Affichage.CustomPanel;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Vector;

public class Dialogue {

    public RqtDispenser rqtDispenser;
    private POI poi;
    private Lieu lieu;

    public RqtDispenser getRqtDispenser() {
        return rqtDispenser;
    }

    public Dialogue() {
        rqtDispenser = new RqtDispenser();
    }

    public void setRqtDispenser(RqtDispenser newRqtDispenser) {
        this.rqtDispenser = newRqtDispenser;
    }

    //Gestion des POI
    public void addPOI(POI poi, Lieu lieu) {
        lieu.getList_POI().add(poi);
        rqtDispenser.AddPOItoLieu(poi, lieu);
    }

    public void insertPOI(POI poi) {
        rqtDispenser.AddDescriptif(poi.getTexte());
        for (String lien : poi.getLiens()) {
            rqtDispenser.AddLien(lien);
            rqtDispenser.AddLienToDescriptif(lien, poi.getTexte());
        }
        rqtDispenser.AddPoi(poi.getLibelle(), poi.getX(), poi.getY(), poi.getTexte());
        poi.setId(rqtDispenser.getIDPOI(poi.getLibelle(), poi.getX(), poi.getY()));
    }

    public void CreationNouveauPoint(MouseEvent e) {
        CustomPanel Carte = Affichage.getCarte();
        poi = new POI();
        Carte.setLayout(null);
        poi.setBounds(10, 10, 10, 10);
        poi.setLocation(e.getX(), e.getY());
        poi.setX(e.getX());
        poi.setY(e.getY());
        poi.setVisible(false);
        Carte.add(poi);
        try {
            Ajouter Fenetre = new Ajouter();
            Fenetre.AddPOI(poi);
        } catch (IOException ex) {
            System.out.println(ex.getMessage());
        }
        poi.addMouseListener(new MouseListener() {
            @Override
            public void mouseClicked(MouseEvent e) {
            }

            @Override
            public void mousePressed(MouseEvent e) {
            }

            @Override
            public void mouseReleased(MouseEvent e) {
            }

            @Override
            public void mouseEntered(MouseEvent e) {
                System.out.println(poi.getLibelle());
            }

            @Override
            public void mouseExited(MouseEvent e) {
            }
        });
    }

    //Modification de POI
    public void modifier_POI(POI poi) {
        rqtDispenser.modifyLibellePOI(poi);
        rqtDispenser.modifyDescriptifByPOI(poi);

        //Marche pas encore
        /*for (String lien : poi.getLiens()) {
         rqtDispenser.AddLien(lien);
         rqtDispenser.AddLienToDescriptif(lien, poi.getTexte());
         }*/
    }

    //Gestion des Lieux
    public void getPOISLieu(Lieu lieu) {
        lieu.setList_POI(rqtDispenser.getPOIS(lieu.getLibelle()));
    }

    public void getDesCriptifLienByPOI(POI poi) {
        poi.setHypertexte(rqtDispenser.getDescriptifLienByPOI(poi));
    }

    public Lieu getLieu(String nom) {
        lieu = rqtDispenser.SelectLieu(nom);
        return lieu;
    }

    public void insertLieu() {

    }

    public void supprimer_POI(POI poi) {
        rqtDispenser.DeletePOIFromLieu(poi);
        rqtDispenser.DeletePOI(poi);
    }

    
    public List<Lieu> rechercheLieu(String chaineArechercher){
        rqtDispenser = new RqtDispenser();
        boolean requeteSpecifique = false;
        List<Lieu> listeDeReponses;
     //   CharSequence a = "\"";
        

        /*commmence par " finit par ", contient n lettres upp et lower*/
        if(chaineArechercher.matches("^\".+\"$")){
//        if (chaineArechercher.matches("^\"[a-zA-Z]+\"$")){
            requeteSpecifique = true; 
        }
        

       listeDeReponses = rqtDispenser.requeteDeRechercheLieu(chaineArechercher, requeteSpecifique);
            
        /*
        Vector monVecteur = new Vector();
        for(Descriptable descriptableCourant : listeDeReponses){
        //    monVecteur.add(descriptableCourant.getLibelle());
            monVecteur.add(descriptableCourant);
        }
        */
        return listeDeReponses;
    //    return monVecteur;
    }



    public List<String> getHistorique() {
        List<String> chaine = new ArrayList<>();
        int i = 0;
        File historique = new File("historique.txt");
        if (historique.exists()) {
            try {
                try (BufferedReader br = new BufferedReader(new FileReader(historique))) {
                    String ligne;
                    do {
                        ligne = br.readLine();
                        if (ligne != null) {
                            chaine.add(ligne);
                            i++;
                        } else {
                            break;
                        }
                    } while (br != null);
                }
            } catch (IOException E) {
                System.out.println(E.getMessage());
            }
        }
        return chaine;
    }
    

    public List<String> getNews() {
        List<String> chaine = new ArrayList<>();
        int i = 0;
        File historique = new File("news.txt");
        int y = 0;
        if (historique.exists()) {
            try {
                try (BufferedReader br = new BufferedReader(new FileReader(historique))) {
                    String ligne;
                    do {
                        ligne = br.readLine();
                        if (ligne != null) {
                            chaine.add(ligne);
                            i++;
                        } else {
                            break;
                        }
                    } while (br != null);
                }
            } catch (IOException E) {
                System.out.println(E.getMessage());
            }
        }
        return chaine;
    }

    public void WriteInFileHistorique(POI poi) {
        Date date = new Date();
        String content_to_write = "\r\n" + poi.getId() + "/" + poi.getLibelle() + "/" + date;
        File historique = new File("historique.txt");
        if (!historique.exists()) {
            try {
                historique.createNewFile();
                FileWriter fw = new FileWriter("historique.txt", true);
                try (BufferedWriter bw = new BufferedWriter(fw)) {
                    bw.write(content_to_write);
                }
            } catch (IOException ex) {
            }
        } else {
            try {
                FileWriter fw = new FileWriter("historique.txt", true);
                try (BufferedWriter bw = new BufferedWriter(fw)) {
                    bw.write(content_to_write);
                }
            } catch (IOException ex) {
                System.out.println(ex.getMessage());
            }

        }
    }
    

    public News WriteIntoNewsFile(Descriptable element) {
        Date date = new Date();
        News news = new News();
        news.historiser(element);
        String content_to_write = "\r\n" + element.getId() + "/" + element.getLibelle() + " "
                + "/" + element.getClass() + "/" + date;
        File historique = new File("news.txt");
        if (!historique.exists()) {
            try {
                historique.createNewFile();
                FileWriter fw = new FileWriter("news.txt", true);
                try (BufferedWriter bw = new BufferedWriter(fw)) {
                    bw.write(content_to_write);
                }
            } catch (IOException ex) {

            }
        } else {
            try {
                FileWriter fw = new FileWriter("news.txt", true);
                try (BufferedWriter bw = new BufferedWriter(fw)) {
                    bw.write(content_to_write);
                }
            } catch (IOException ex) {
                System.out.println(ex.getMessage());
            }

        }
        return news;

    }

    public List<POI> getListPoiListModel(String Lieux) {
        return rqtDispenser.SelectPoiParcours(Lieux);
    }

    public void addParcours(String Libelle, List<String> ListIDPOI, String Descriptif, String Lieux) {
        Integer ID_Parcours;
        rqtDispenser.AddDescriptif(Descriptif);
        rqtDispenser.AddParcours(Descriptif, Libelle, Lieux);
//        ID_Parcours = rqtDispenser.GetIDParcours(Libelle);
        rqtDispenser.LinkParcoursToPOI(ListIDPOI, Libelle);
    }

    public List<Parcours> SelectParcoursModification() {
        return rqtDispenser.SelectParcoursModification();
    }

    public List<POI> SelectPOIByParcours(String NomParcours) {
        return rqtDispenser.getPOIByParcours(NomParcours);
    }

    public void ModifParcours(String OldLibelle, String NewLibelle, String OldDescriptif, String NewDescriptif, List<String> ListOldPoi, List<String> ListNewPOI) {
        rqtDispenser.ModifierLibelleParcours(OldLibelle, NewLibelle);
        rqtDispenser.ModifierDescriptifParcours(OldDescriptif, NewDescriptif);
        rqtDispenser.DeleteLinkParcoursPoi(ListOldPoi);
        rqtDispenser.LinkParcoursToPOI(ListNewPOI, NewLibelle);
    }

    public void SupprimerParcours(String Libelle) {
        rqtDispenser.DeleteLinkParcoursWithPoi(Libelle);
        rqtDispenser.SupprimerParcours(Libelle);

    }

    public List<Lieu> getUrlEtLibelleLieu() { //tst
        List<Lieu> listeLieu = rqtDispenser.SelectUrlEtLibelleLieu();
        return listeLieu;

    }

    public void insertLieu(Lieu lieu) {
        rqtDispenser.AddLien(lieu.getUrl());
        rqtDispenser.AddDescriptif(lieu.getTexte());
        rqtDispenser.AddLieu(lieu.getLibelle(), lieu.getCarte());
        //rqtDispenser.jesaispas
    }

    public void supprimerLieu(Lieu lieu) {
        rqtDispenser.DeleteLinkLieuxWithPoi(lieu.getLibelle());
        rqtDispenser.SupprimerLieux(lieu.getLibelle());
    }
}

